﻿using System.Web.Mvc;
using LogikBug.ModularMvc.Factories;

namespace LogikBug.ModularMvc
{
	public abstract class ModuleControllerBase : Controller
	{
		#region Fields

		private ModularHttpContext _moduleContext;

		#endregion

		#region Properties

		protected ModularHttpContext ModuleContext
		{
			get
			{
				return _moduleContext ?? (_moduleContext = HttpContext.GetModularHttpContext());
			}
		}

		protected IModuleProvider Provider
		{
			get
			{
				return ModuleProvider.Current;
			}
		}

		#endregion

		#region Methods

		protected override ViewResult View(IView view, object model)
		{
			if (model != null)
			{
				ModelFactory.Current.Cache.Add(model.GetType(), model);
			}

			return base.View(view, model);
		}

		#endregion
	}

	//public class ModuleControllerBase<T, TRepository> : ModuleControllerBase where TRepository : IRepository<T>
	//{
	//    #region Constructors
		
	//    public ModuleControllerBase(TRepository repository)
	//    {
	//        Repository = repository.ThrowIfNull();
	//    }

	//    #endregion

	//    #region Properties

	//    public TRepository Repository { get; protected set; }

	//    #endregion

	//    #region Methods

	//    [HttpGet]
	//    public virtual ActionResult Index()
	//    {
	//        return View(Repository.GetAll());
	//    }

	//    [HttpGet]
	//    public virtual ActionResult Details(Guid id)
	//    {
	//        return View(Repository.Get(id));
	//    }

	//    [HttpGet]
	//    public virtual ActionResult Edit(Guid id)
	//    {
	//        return View(Repository.Get(id));
	//    }

	//    [HttpPost]
	//    public virtual ActionResult Edit(T model)
	//    {
	//        if (ModelState.IsValid)
	//        {
	//            Repository.Edit(model);

	//            return RedirectToAction("Index");
	//        }

	//        return View(model);
	//    }

	//    [HttpGet]
	//    public virtual ActionResult Create()
	//    {
	//        return View();
	//    }

	//    [HttpPost]
	//    public virtual ActionResult Create(T model)
	//    {
	//        if (ModelState.IsValid)
	//        {
	//            Repository.Add(model);

	//            return RedirectToAction("Index");
	//        }

	//        return View(model);
	//    }

	//    [HttpPost]
	//    public virtual ActionResult Delete(T model)
	//    {
	//        if (ModelState.IsValid)
	//        {
	//            Repository.Remove(model);

	//            return RedirectToAction("Index");
	//        }

	//        return View(model);
	//    }

	//    #endregion
	//}
}
